from playwright.sync_api import sync_playwright

def baidu_login_demo():
    print("开始执行百度登录演示...")
    
    with sync_playwright() as p:
        # 启动浏览器（使用有界面模式方便调试）
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        try:
            # 打开百度首页
            print("正在打开百度首页...")
            page.goto("https://www.baidu.com", wait_until="networkidle")
            print("已打开百度首页")
            
            # 尝试多种方式查找登录按钮
            print("尝试查找登录按钮...")
            login_button = None
            
            # 方式1：尝试查找包含"登录"文本的按钮或链接
            try:
                login_button = page.locator("//a[contains(text(), '登录') or contains(@href, 'login')]").first
                if login_button.is_visible():
                    login_button.click()
                    print("方式1：通过文本定位并点击登录按钮")
            except Exception as e:
                print(f"方式1失败: {e}")
            
            # 如果方式1失败，尝试方式2：通过ID选择器
            if not login_button or not login_button.is_visible():
                try:
                    login_button = page.locator("#u1 a[name='tj_login']").first
                    if login_button.is_visible():
                        login_button.click()
                        print("方式2：通过ID选择器点击登录按钮")
                except Exception as e:
                    print(f"方式2失败: {e}")
            
            # 如果方式2也失败，尝试方式3：遍历所有a标签查找
            if not login_button or not login_button.is_visible():
                try:
                    links = page.locator("a")
                    count = links.count()
                    for i in range(count):
                        link_text = links.nth(i).text_content() or ""
                        if "登录" in link_text or "Login" in link_text:
                            links.nth(i).click()
                            print(f"方式3：找到并点击包含'登录'文本的链接")
                            break
                except Exception as e:
                    print(f"方式3失败: {e}")
            
            # 等待登录弹窗或页面加载
            page.wait_for_load_state("domcontentloaded")
            
            # 尝试选择账号密码登录
            try:
                password_tab = page.locator("text=用户名密码登录").first
                if password_tab.is_visible():
                    password_tab.click()
                    print("已选择账号密码登录")
            except Exception as e:
                print(f"选择账号密码登录时出错: {e}")
            
            # 输入账号和密码
            try:
                # 等待输入框出现
                page.wait_for_selector("input[name='userName']", timeout=10000)
                
                # 输入账号
                username_input = page.locator("input[name='userName']").first
                username_input.fill("123456@qq.com")
                print("已输入账号")
                
                # 输入密码
                password_input = page.locator("input[name='password']").first
                password_input.fill("Test123!")
                print("已输入密码")
                
                # 点击登录按钮
                login_submit = page.locator("button[type='submit']").first
                if login_submit.is_visible():
                    login_submit.click()
                    print("已点击登录按钮")
                else:
                    # 尝试其他可能的登录按钮选择器
                    login_submit = page.locator("#TANGRAM__PSP_11__submit").first
                    if login_submit.is_visible():
                        login_submit.click()
                        print("已通过备用选择器点击登录按钮")
                
                # 等待登录完成
                page.wait_for_load_state("networkidle", timeout=15000)
                print("登录操作完成")
                
            except Exception as e:
                print(f"输入账号密码或点击登录时出错: {e}")
                # 保存错误截图以便调试
                page.screenshot(path="baidu_login_error.png")
                print("已保存错误截图到 baidu_login_error.png")
            
        except Exception as e:
            print(f"演示过程中出现错误: {e}")
        finally:
            # 关闭浏览器
            browser.close()
            print("已关闭浏览器")
    
    print("演示完成！")

# 运行演示
if __name__ == "__main__":
    baidu_login_demo()